package com.ias.business.testbiz.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ias.business.testbiz.entity.TestBizEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 测试业务Mapper接口
 * 演示MyBatis自定义SQL功能
 * 
 * @author IAS Team
 * @since 1.0.0
 */
@Mapper
public interface TestBizMapper extends BaseMapper<TestBizEntity> {

    /**
     * 根据业务编码查询
     * 
     * @param bizCode 业务编码
     * @return 测试业务实体
     */
    TestBizEntity selectByBizCode(@Param("bizCode") String bizCode);

    /**
     * 根据业务类型查询列表
     * 
     * @param bizType 业务类型
     * @return 业务列表
     */
    List<TestBizEntity> selectByBizType(@Param("bizType") Integer bizType);

    /**
     * 关键词搜索
     * 
     * @param keyword 搜索关键词
     * @return 业务列表
     */
    List<TestBizEntity> selectByKeyword(@Param("keyword") String keyword);

    /**
     * 分页查询（带条件）
     * 
     * @param id 主键ID
     * @param bizName 业务名称
     * @param bizCode 业务编码
     * @param bizType 业务类型
     * @param status 状态
     * @param deleted 删除标识
     * @param orderBy 排序字段
     * @return 业务列表
     */
    List<TestBizEntity> selectPageWithCondition(
            @Param("id") Long id,
            @Param("bizName") String bizName,
            @Param("bizCode") String bizCode,
            @Param("bizType") Integer bizType,
            @Param("status") Integer status,
            @Param("deleted") Integer deleted,
            @Param("orderBy") String orderBy
    );

    /**
     * 统计各业务类型数量
     * 
     * @param status 状态（可选）
     * @return 统计结果Map，key为bizType，value为count
     */
    List<Map<String, Object>> countByBizType(@Param("status") Integer status);

    /**
     * 查询启用状态的业务数量
     * 
     * @return 启用业务数量
     */
    Long countActiveTestBiz();

    /**
     * 根据时间范围查询
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 业务列表
     */
    List<TestBizEntity> selectByTimeRange(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    /**
     * 批量查询（根据ID列表）
     * 
     * @param ids ID列表
     * @return 业务列表
     */
    List<TestBizEntity> selectByIds(@Param("ids") List<Long> ids);

    /**
     * 批量更新状态
     * 
     * @param ids ID列表
     * @param status 新状态
     * @return 影响行数
     */
    int batchUpdateStatus(@Param("ids") List<Long> ids, @Param("status") Integer status);

    /**
     * 批量软删除
     * 
     * @param ids ID列表
     * @return 影响行数
     */
    int batchSoftDelete(@Param("ids") List<Long> ids);

    /**
     * 复杂查询 - 多条件统计
     * 
     * @param bizType 业务类型（可选）
     * @return 统计结果
     */
    Map<String, Object> selectStatistics(@Param("bizType") Integer bizType);

    /**
     * 动态插入（仅插入非空字段）
     * 
     * @param entity 实体对象
     * @return 影响行数
     */
    int insertSelective(TestBizEntity entity);

    /**
     * 批量插入
     * 
     * @param list 实体列表
     * @return 影响行数
     */
    int batchInsert(@Param("list") List<TestBizEntity> list);

    /**
     * 动态更新（仅更新非空字段）
     * 
     * @param entity 实体对象
     * @return 影响行数
     */
    int updateSelective(TestBizEntity entity);

    /**
     * 检查业务编码是否存在
     * 
     * @param bizCode 业务编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean existsByBizCode(@Param("bizCode") String bizCode, @Param("excludeId") Long excludeId);

    /**
     * 获取最新的N条记录
     * 
     * @param limit 限制数量
     * @return 业务列表
     */
    List<TestBizEntity> selectLatest(@Param("limit") Integer limit);

    /**
     * 自定义分页查询（演示手动分页）
     * 
     * @param keyword 搜索关键词
     * @param bizType 业务类型
     * @param status 状态
     * @param offset 偏移量
     * @param pageSize 页大小
     * @return 业务列表
     */
    List<TestBizEntity> selectByPage(
            @Param("keyword") String keyword,
            @Param("bizType") Integer bizType,
            @Param("status") Integer status,
            @Param("offset") Integer offset,
            @Param("pageSize") Integer pageSize
    );

    /**
     * 获取分页总数
     * 
     * @param keyword 搜索关键词
     * @param bizType 业务类型
     * @param status 状态
     * @return 总数
     */
    Long selectCountByPage(
            @Param("keyword") String keyword,
            @Param("bizType") Integer bizType,
            @Param("status") Integer status
    );
} 